1. 概述
Redis (/ˈrɛdɪs/; Remote Dictionary Server) is an in-memory data structure store, used as a distributed, in-memory key–value database, cache and message broker, with optional durability. Redis supports different kinds of abstract data structures, such as strings, lists, maps, sets, sorted sets, HyperLogLogs, bitmaps, streams, and spatial indexes. The project is developed and maintained by a project core team and as of 2015 is sponsored by Redis Labs. It is open-source software released under a BSD 3-clause license.
Redis(Remote Dictionary Server ),即远程字典服务,是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。
Redis会周期性地把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并在此基础上实现了主从(master-salve)同步,其是当下最热门的NoSQL技术之一,称之为结构化数据库,其性能能够达到读速度110000次/s,写速度81000次/s。
2. 数据类型
Redis的外围由一个键、值映射的字典构成,与其他非关系型数据库主要不同在于:Redis中值的类型不止于字符串,还支持多种抽象数据类型,其提供了**五种数据类型:string, hash, list, set 以及 zset(sorted set)**。
2.1 String
String类型中Value值最大可容纳的数据长度为512MB
字符串(String)是Redis中最常用的类型,是一个由字节组成的序列,它在Redis中是二进制安全的,这便意味着该类型可以接受任何格式的数据。
1 | 设置string类型的缓存数据,key为hello,value为world |
2.2 List
List类型中可以包含的最大元素数量为4294967295
列表(List)表示允许从序列的两端推入或弹出元素,列表由多个字符串值组成的可重复的序列,是链表结构,所以从两端进行插入或弹出的时间复杂度为O(1)。
1 | 从左推入元素 |
- 应用场景
- 热搜排行榜
- 消息队列
2.3 Hash
一个Hash散列中可以存储4294967295个键值对
相当于一个key中存在多个map,Redis中的散列可以看成具有String key和String value的map容器,可以将多个key-value存储到一个key中。
1 | 设置Key为iammapkey,其中value为一个键值对,键为name,值为test |
2.4 Set
一个Set集合可以容纳的最大元素数量为4294967295
集合(Set)是无序不重复的,此处的无需是数据不重复。和列表一样,在执行插入的时候判断是否存在某元素,集合最大的优势在于其可以进行交集、并集和差集的操作。
1 | 设置Key为iamsetkey,其中value为三个分别是"zchengb","zxchengb","zchengb" |
2.5 ZSet
ZSet为有序集合(Sorted Set),有顺序,不能重复,此处的不能重复是指ZSet中的键值对中的值不可重复,可按照升序或降序输出集合序列。
1 | 设置Key为iamzsetkey,其中value为四个键值对 |
3. 安装
3.1 Docker
Tips:本节所述需安装Docker使用
关于Linux下Docker的安装及使用可参考该文章
- 拉取Redis镜像
1 | docker pull redis |
- 新建挂载配置文件夹
Docker中的Redis 默认配置只能够本地连接(因为其默认绑定允许连接的IP是127.0.0.1),所以在使用 Redis Desktop Manager连接会报错,因此需要手动挂载Redis 配置文件
1 | mkdir -p /root/docker/redis/data |
- 增加配置文件,内容如下
1 | bind 127.0.0.0 |
- 创建Redis容器并启动
1 | docker run --name redis -p 6379:6379 -v /root/docker/redis/data:/data -v /root/docker/redis/conf/redis.conf:/etc/redis/redis.conf -d redis redis-server /etc/redis/redis.conf |
至此,Docker启动Redis完成。
3.2 Windows
实际上Redis官方并没有提供Windows版的Redis,目前互联网中存在的Windows版Reids均为第三方实现的
可前往微软开源项目中下载Windows版Redis,其中选择Redis-xxx.msi进行安装,安装完成后,在Redis目录下双击打开redis-server.exe即可成功运行Redis。
目录下文件如下:
- redis-server.exe:服务端程序,提供 redis 服务
- redis-cli.exe: 客户端程序,通过它连接 redis 服务并进行操作
- redis-check-dump.exe:RDB 文件修复工具
- redis-check-aof.exe:AOF 文件修复工具
- redis-benchmark.exe:性能测试工具,用以模拟同时由 N 个客户端发送 M 个 SETs/GETs 查询 (类似于 Apache 的 ab 工具)
- redis.windows.conf: 配置文件,将 redis 作为普通软件使用的配置,命令行关闭则 redis 关闭
- redis.windows-service.conf:配置文件,将 redis 作为系统服务的配置
4. 整合Spring Boot
4.1 Maven依赖
Spring Boot整合Redis依赖情况如下所示,在使用父级pom为spring-boot-starter-parent
时仅需导入spring-boot-starter-data-redis
依赖。
1 | <!-- Inherit defaults from Spring Boot --> |
4.2 配置YAML
在application.yml
文件中的spring
下添加如下配置内容。
1 | # Redis相关配置 |
4.3 RedisConfig
注意开启
@EnableCaching
注解,否则缓存配置不生效
RedisConfig主要为Redis的配置类,通过Spring Boot中的@Configuration
与@Bean
注解将配置注入到容器中使之生效,具体代码如下所示。
1 | /** |
创建上述RedisConfig.java
用于配置Redis序列化,即生成一个RedisTemplate<String, Object>
对象可供各种情况使用。如可在项目中存储各种JSON形式的实体类至Redis缓存中,并可从缓存中读取反序列化为实体对象。
4.4 RedisManager
RedisManager主要作为工具类提供快速操作Redis的方法,其由一个IGlobalCache.java
接口与RedisManager.java
工具类实现而成,具体代码如下所示。
- IGlobalCache.java
1 | /** |
- RedisManager.java
其中
@Getter
注解为使用了Lombok插件
此工具类不采用静态(static)形式主要是为了防止并发情况下造成的意外情况
1 | /** |
至此,Redis与Spring Boot整合完成。
5. 主从复制
主从复制为了减缓服务器压力,架构中经常会使用,最低标准分为一主二从,即一台主机两台从机,其中主机可读可写,而从机只可读不可写入。
1 | 查看当前库的信息 |
修改三台机器的redis.conf
配置文件时,应注意修改端口、PID进程文件名称、log文件名称和dump.rdb名称。
默认情况下,每台Redis服务器都是主节点,一般只需要配置从机即可。
5.1 命令行形式
可在从机下通过redis-cli
命令行工具中的SLAVEOF IPADDRESS PORT
命令配置主机,如SLAVEOF 127.0.0.1 6379
,需要注意的是,通过命令行配置的主从模式是临时的,即重启后主从模式将会失效。
5.2 配置文件形式
在 redis.conf
配置文件中按照slaveof <masterip> <masterport>
格式写入主机信息。需要注意的是,如果主机有认证密码则应以masterauth <master-password>
格式继续写入主机连接密码。
随后分别启动主机与从机,分别在从机与主机查看当前主从信息,至此主从复制配置完成。
1 | 从机 |
6. 哨兵模式(Redis Sentinel)
哨兵模式(Redis Sentinel)是Redis高可用的实现方案,Sentinel是一个管理多个Redis实例的工具,它可以对Redis进行监控、通知和故障转移。
一般Redis采用主从复制模式,而其中的主机如果断开,则需要手动在从机群中指定一个新主机,这样费时费力,采用哨兵模式进行监控则可以由其自动监控Redis集群,当主机宕机时,自动监控并在内部选举出新主机进行通知。
6.1 下线判断
默认情况下,每个Sentinel节点都会进行发送PING命令来确认Redis节点与Sentinel节点是否在线。
a. 主观下线
主观下线适用于所有主节点与从节点。如果down-after-milliseconds
毫秒内,Sentinel没有收到目标节点的有效回复,则会判定该节点为主观下线。
b. 客观下线
客观下线只适用于主节点,如果主节点出现故障,Sentinel节点会通过sentinel is-master-down-by-addr
命令,向其他Sentinel节点询问对该节点的状态判断,如果超过<quorum>
个数的Sentinel节点认为该主节点不可达,则Sentinel节点会判断该主节点为客观下线。
6.2 部署须知
- 一个稳健的哨兵集群应该保证至少三台Sentinel实例,并保证这些实例放置在不同的机器上
- Sentinel无法保证强一致性
- 常见的客户端应用库都支持Sentinel
- Sentinel需要通过不断的测试与观察,才能保证高可用。
6.3 配置文件
1 | 哨兵sentinel实例运行的端口,默认26379 |
根据上述配置文件配置好后使用sudo redis-sentinel /usr/local/redis-sentinel/sentinel-xxx.conf
分别启动Sentinel节点。
6.4 常用命令
- 检查其他
Sentinel
节点的状态,返回PONG
为正常。
1 | PING sentinel |
- 显示被监控的所有 主节点 以及它们的状态。
1 | SENTINEL masters |
- 显示指定 主节点 的信息和状态。
1 | SENTINEL master <master_name> |
- 显示指定 主节点 的所有 从节点 以及它们的状态。
1 | SENTINEL slaves <master_name> |
返回指定 主节点 的 IP
地址和 端口。如果正在进行 failover
或者 failover
已经完成,将会显示被提升为 主节点 的 从节点 的 IP
地址和 端口。
1 | SENTINEL get-master-addr-by-name <master_name> |
- 重置名字匹配该 正则表达式 的所有的 主节点 的状态信息,清除它之前的 状态信息,以及 从节点 的信息。
1 | SENTINEL reset <pattern> |
- 强制当前
Sentinel
节点执行failover
,并且不需要得到其他Sentinel
节点的同意。但是failover
后会将 最新的配置 发送给其他Sentinel
节点。
1 | SENTINEL failover <master_name> |